www.gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/GPSModel.cpp
//Download by http://www.NewXing.com /******************************************************************************** **** 名称:GPS仿真模块 ***** **** 编写:孙瑞胜 **** 日期:2009年11月8日 ***** *********************************************************************************/ /****************************************************** 函数功能描述:GPS单元仿真器 /******************************************************* 注: Fb=(I+Ka)[I+(dCab)']*fb+零偏+一介马尔可夫过程 + 正态分布白噪声 Wb=(I+Kg)[I+(dCgb)']*wb+零漂+一介马尔可夫过程 +正态分布白噪声 *******************************************************/ #include "stdafx.h" #include "simGPS.h" #include "ReferenceFrame.h" extern double t_step; //时间步长 extern void Rands2( int &IX, double &YEL, double S, double AM, double &V );//正态分布; CGPS::CGPS() { x = 0.0 ; y = 0.0 ; z = 0.0; Vx = 0.0 ; Vy = 0.0 ; Vz = 0.0 ; Ax = 0.0 ; Ay = 0.0 ; Az = 0.0 ; } CGPS::~CGPS() { } void CGPS::SetGPS( ) //白噪声 { } void CGPS::Get_err_GPS( double dGPS[] ) { unsigned seeds ; static long int NumCount = 0 , nNUM = 1 ; if ( !NumCount ) { seeds = (unsigned)time( NULL ) % 100 ; } static int IXX[3] = { seeds, seeds + 25, seeds +100 }; // static int IXX[3] = { 175, 150, 190 }; static double Sigma[3] = { 2.0, 5.0, 2.0 }, //GPS的均方差取10m, 15m // static double Sigma[3] = { 0.0, 0.0, 0.0 }, //GPS的均方差取10m, 15m AM[3] = { 0.0, 0.0, 0.0 }; //GPS的均值取0.0m static double YELL[3], Value[3], old_Value[3]; static ofstream fGPSRand( "simGPS.txt" ); //随机数文件 double LIM_GPS ; /**/ fGPSRand << NumCount << " " << nNUM << " "; for ( int i = 0; i < 3; ++ i ) { if ( NumCount % 50 == 0 ) //每1s更新一组 { Rands2( IXX[i], YELL[i], Sigma[i], AM[i], Value[i] ) ; //生成随机干扰 LIM_GPS = fabs(AM[i])+3*Sigma[i] ; //干扰风的极限值 if ( fabs(Value[i]) > LIM_GPS ) { Value[i] = LIM_GPS * fabs(Value[i]) / Value[i] ; } nNUM = 1 ; } dGPS[i] = old_Value[i] + ( Value[i] - old_Value[i] ) * nNUM / 50 ; // GPS误差分解到每一步 fGPSRand << dGPS[i] << " " ; if ( nNUM == 50 ) { old_Value[i] = Value[i] ; } } NumCount ++ ; nNUM ++ ; fGPSRand << endl; return ; } void CGPS::CalGPSModel( double XS[], double alpha/*射击方位角/rad*/ ) { // double GPS_c[6], double GPS[6] ; Pos_l[0] = XS[1] ; Pos_l[1] = XS[2] ; Pos_l[2] = XS[3] ; //x,y,z Vel_l[0] = XS[4] ; Vel_l[1] = XS[5] ; Vel_l[2] = XS[6] ; //Vx,Vy,Vz CFrameofRef *pRefFrame = new CFrameofRef; pRefFrame->Ground2Nav( alpha, Vel_l, Vel_n ) ; //发射系下的速度转到导航系 pRefFrame->Ground2ECEF( alpha, Pos_l, Pos_ecef ) ; //发射系下的位置转到ecef系 Get_err_GPS( dGPS ) ; //获得GPS误差,包括位置和速度 for ( int i = 0; i < 3; ++i ) { Pos_ecef[i] = Pos_ecef[i] + dGPS[i] ; Vel_n[i] = Vel_n[i] + dGPS[i+3] ; } pRefFrame->ECEF_2_WGS84( Pos_ecef, Pos_WGS84 ) ; //ecef系转到WGS84系 ReadGPSData( GPS_c, GPS ) ; UpdateGPSData( GPS ) ; return ; } void CGPS::ReadGPSData( double GPS_c[6], double GPS[6] ) { double dGPS[6] ; Get_err_GPS( dGPS ) ; for ( int i = 0; i < 6; ++i ) { GPS[i] = GPS_c[i] + dGPS[i] ; } return ; } void CGPS:: UpdateGPSData( double GPS[6] ) { x = GPS[0] ; y = GPS[1] ; z = GPS[2] ; return ; }